<!DOCTYPE html>
<html lang="en">

<!-- Head tag -->
<head><meta name="generator" content="Hexo 3.8.0">

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!--Description-->

    

    
        <meta name="description" content="首先，先看两组数据：
上面的数据，就是h264的视频数据。H264结构中，一个视频图像编码后的数据叫做一帧，一帧由一个片（slice）或多个片组成，一个片由一个或多个宏块（MB）组成。
一、NALNAL全称Network Abstract Layer，即网络抽象层。在H.264/AVC视频编码标准中">
    

    <!--Author-->
    
        <meta name="author" content="Cyrus">
    

    <!--Open Graph Title-->
    
        <meta property="og:title" content="H264 nalu类型及解析">
    

    <!--Open Graph Description-->
    
        <meta property="og:description" content="首先，先看两组数据：
上面的数据，就是h264的视频数据。H264结构中，一个视频图像编码后的数据叫做一帧，一帧由一个片（slice）或多个片组成，一个片由一个或多个宏块（MB）组成。
一、NALNAL全称Network Abstract Layer，即网络抽象层。在H.264/AVC视频编码标准中">
    

    <!--Open Graph Site Name-->
        <meta property="og:site_name" content="Cyrus的技术空间">

    <!--Type page-->
    
        <meta property="og:type" content="article">
    

    <!--Page Cover-->
    
    
        <meta property="og:image" content="http://cyrus_huang.gitee.io/bloghttp://www.codeblocq.com/assets/projects/hexo-theme-clean-blog/img/home-bg.jpg">
    

        <meta name="twitter:card" content="summary_large_image">

    

    
        <meta name="twitter:image" content="http://cyrus_huang.gitee.io/bloghttp://www.codeblocq.com/assets/projects/hexo-theme-clean-blog/img/home-bg.jpg">
    

    <!-- Title -->
    
    <title>H264 nalu类型及解析 - Cyrus的技术空间</title>

    <!-- Bootstrap Core CSS -->
    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom CSS -->
    <link rel="stylesheet" href="/blog/css/style.css">

    <!-- Custom Fonts -->
    <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet" type="text/css">
    <link href="//fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic" rel="stylesheet" type="text/css">
    <link href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css">

    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    <script src="//oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
    <script src="//oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->

    <!-- Gallery -->
    <link href="//cdnjs.cloudflare.com/ajax/libs/featherlight/1.3.5/featherlight.min.css" type="text/css" rel="stylesheet">

    <!-- Google Analytics -->
    


    <!-- favicon -->
    

</head>


<body>

    <!-- Menu -->
    <!-- Navigation -->
<nav class="navbar navbar-default navbar-custom navbar-fixed-top">
    <div class="container-fluid">
        <!-- Brand and toggle get grouped for better mobile display -->
        <div class="navbar-header page-scroll">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/blog/">Cyrus的技术空间</a>
        </div>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav navbar-right">
                
                    <li>
                        <a href="/blog/">
                            
                                Home
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/blog/archives">
                            
                                Archives
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/blog/tags">
                            
                                Tags
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/blog/categories">
                            
                                Categories
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="https://github.com/klugjo/hexo-theme-clean-blog">
                            
                                <i class="fa fa-github fa-stack-2x"></i>
                            
                        </a>
                    </li>
                
            </ul>
        </div>
        <!-- /.navbar-collapse -->
    </div>
    <!-- /.container -->
</nav>

    <!-- Main Content -->
    <!-- Page Header -->
<!-- Set your background image for this header in your post front-matter: cover -->

<header class="intro-header" style="background-image: url('http://www.codeblocq.com/assets/projects/hexo-theme-clean-blog/img/home-bg.jpg')">
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <div class="post-heading">
                    <h1>H264 nalu类型及解析</h1>
                    
                    <span class="meta">
                        <!-- Date and Author -->
                        
                            Posted by Cyrus on
                        
                        
                            2019-01-27
                        
                    </span>
                </div>
            </div>
        </div>
    </div>
</header>

<!-- Post Content -->
<article>
    <div class="container">
        <div class="row">

            <!-- Tags and categories -->
           
                <div class="col-lg-4 col-lg-offset-2 col-md-5 col-md-offset-1 post-tags">
                    
                        

<a href="/blog/categories/音视频/">音视频</a>

                    
                </div>
                <div class="col-lg-4 col-md-5 post-categories">
                    
                </div>
            

            <!-- Gallery -->
            

            <!-- Post Main Content -->
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <p>首先，先看两组数据：<br><img src="http://cyrus_huang.gitee.io/blog/2019/01/27/H264-nalu类型及解析/h264_data.png" alt=""></p>
<p>上面的数据，就是h264的视频数据。H264结构中，一个视频图像编码后的数据叫做一帧，一帧由一个片（slice）或多个片组成，一个片由一个或多个宏块（MB）组成。</p>
<h4 id="一、NAL"><a href="#一、NAL" class="headerlink" title="一、NAL"></a>一、NAL</h4><p>NAL全称Network Abstract Layer，即网络抽象层。在H.264/AVC视频编码标准中，整个系统框架被分为了两个层面：视频编码层面（VCL）和网络抽象层面（NAL）。其中，前者负责有效表示视频数据的内容，而后者则负责格式化数据并提供头信息，以保证数据适合各种信道和存储介质上的传输。NAL单元是NAL的基本语法结构，它包含一个字节的头信息和一系列来自VCL的称为原始字节序列载荷（RBSP）的字节流。</p>
<h5 id="1、帧格式"><a href="#1、帧格式" class="headerlink" title="1、帧格式"></a>1、帧格式</h5><p>H264在网络传输的是NALU，NALU的结构是：NAL头+RBSP，实际传输中的数据流如图所示：<br><img src="http://cyrus_huang.gitee.io/blog/2019/01/27/H264-nalu类型及解析/nalu_zc.png" alt=""></p>
<h5 id="2、帧解析（参照开始数据红色部分）"><a href="#2、帧解析（参照开始数据红色部分）" class="headerlink" title="2、帧解析（参照开始数据红色部分）"></a>2、帧解析（参照开始数据红色部分）</h5><ul>
<li>如果NALU对应的Slice为一帧的开始，则用4字节表示，即0x00 00 00 01;否则用3字节表示，0x00 00 01。</li>
<li>NAL Header:forbidden_bit （F）1bit （在 H.264 规范中规定了这一位必须为 0.）  nal_reference_bit(优先级 NRI)2bit，取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃它而不影响图像的回放,0～3，取值越大，表示当前NAL越重要，需要优先受到保护。如果当前NAL是属于参考帧的片，或是序列参数集，或是图像参数集这些重要的单位时，本句法元素必需大于0。nal_unit_type(类型)5bit,标识其中，nal_unit_type为1， 2， 3， 4， 5的NAL单元称为VCL的NAL单元，其他类型的NAL单元为非VCL的NAL单元。</li>
</ul>
<p>nal_unit_type. 这个NALU单元的类型,1～12由H.264使用，24～31由H.264以外的应用使用,简述如下:<br><img src="http://cyrus_huang.gitee.io/blog/2019/01/27/H264-nalu类型及解析/nalu_type_define.png" alt=""></p>
<p>示例<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">00 00 00 01 67</span><br><span class="line"> 帧开始	 | nal header</span><br><span class="line"> </span><br><span class="line"> 67 --&gt;  0 1 1 0 0 1 1 1</span><br><span class="line"> 		 F|RNI| nal_unit_type</span><br><span class="line"> 可以看出，此帧为优先级最高的SPS数据</span><br><span class="line"> </span><br><span class="line"> 同理</span><br><span class="line"> 00 00 00 01 68  拥有最高优先级的PPS数据</span><br><span class="line"> 00 00 00 01 06  拥有最低优先级的补充增强信息单元（SEI）</span><br><span class="line"> 00 00 00 01 65  拥有最高优先级IDR图像中的片 （即I帧，关键帧）</span><br><span class="line"> 00 00 00 01 61  拥有最高优先级非IDR图像的片（P/B帧)</span><br></pre></td></tr></table></figure></p>
<h4 id="常见nal-unit-type-介绍"><a href="#常见nal-unit-type-介绍" class="headerlink" title="常见nal_unit_type 介绍"></a>常见nal_unit_type 介绍</h4><ul>
<li><p>SPS(nal_unit_type=7)和PPS(nal_unit_type=8)包含了初始化H264解码器所需要的信息参数，包括编码所用的profile,level,图像的宽和高，deblock滤波器等。</p>
</li>
<li><p>I帧（nal_unit_type=5），帧内编码帧，I帧表示关键帧，可以理解为这一帧画面的完整保留，即拥有还原成图像所需的所有数据。</p>
</li>
<li>I帧特点：</li>
<li>1、它是一个全帧压缩帧，将全帧图像信息进行JPEG压缩编码及传输；</li>
<li>2、解码时仅用I帧的数据就可以重构完整图像</li>
<li>3、I帧描述了图像背景和运动主体的详情。</li>
<li>4、I帧不需要参考其他画面生成</li>
<li>5、I帧是P帧和B帧的参考帧（其质量直接影响到同组中以后各帧的质量）</li>
<li>6、I帧不需要考虑运动矢量</li>
<li><p>7、I帧所占数据的信息量比较大</p>
</li>
<li><p>P帧（nal_unit_type=1），前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧（或P帧）的差别，解码时需要用之前缓存的画面叠加上本帧定义的差别，生成最终画面。（也就是差别帧，P帧没有完整画面数据，只有与前一帧的画面差别的数据）</p>
</li>
<li>P帧特点</li>
<li>1、P帧是I帧后面相隔1~2帧的编码帧;</li>
<li>2、P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);</li>
<li>3、解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;</li>
<li>4、P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;</li>
<li>5、P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;</li>
<li>6、由于P帧是参考帧,它可能造成解码错误的扩散;</li>
<li><p>7、由于是差值传送,P帧的压缩比较高。</p>
</li>
<li><p>B帧（nal_unit_type=1），双向预测内插编码帧。B帧是双向差别帧，也就是B帧记录的是本帧与前后帧的差别，换言之，要解码B帧，不仅要取得之前的缓存画面，还要解码之后的画面，通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高，但是解码时CPU会比较累。</p>
</li>
<li>B帧特点</li>
<li>1、B帧是由前面的I或P帧和后面的P帧来进行预测的;</li>
<li>2、B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;</li>
<li>3、B帧是双向预测编码帧;</li>
<li>4、B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;</li>
<li>5、B帧不是参考帧,不会造成解码错误的扩散。</li>
</ul>
<font color="ff0000">注:I、B、P各帧是根据压缩算法的需要，是人为定义的,它们都是实实在在的物理帧。一般来说，I帧的压缩率是7（跟JPG差不多），P帧是20，B帧可以达到50。可见使用B帧能节省大量空间，节省出来的空间可以用来保存多一些I帧，这样在相同码率下，可以提供更好的画质。</font>


                
            </div>

            <!-- Comments -->
            
                <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                    


                </div>
            
        </div>
    </div>
</article>

    <!-- Footer -->
    <hr>

<!-- Footer -->
<footer>
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <ul class="list-inline text-center">
                    

                    

                    
                        <li>
                            <a href="https://github.com/klugjo/hexo-theme-clean-blog" target="_blank">
                                <span class="fa-stack fa-lg">
                                    <i class="fa fa-circle fa-stack-2x"></i>
                                    <i class="fa fa-github fa-stack-1x fa-inverse"></i>
                                </span>
                            </a>
                        </li>
                    

                    

                    

                    
                </ul>
                <p class="copyright text-muted">&copy; 2020 Cyrus<br></p>
                <p class="copyright text-muted">Original Theme <a target="_blank" href="http://startbootstrap.com/template-overviews/clean-blog/">Clean Blog</a> from <a href="http://startbootstrap.com/" target="_blank">Start Bootstrap</a></p>
                <p class="copyright text-muted">Adapted for <a target="_blank" href="https://hexo.io/">Hexo</a> by <a href="http://www.codeblocq.com/" target="_blank">Jonathan Klughertz</a></p>
                <p class="copyright text-muted"><a href="http://www.beian.miit.gov.cn">粤ICP备18110122号-1</a></p>
            </div>
        </div>
    </div>
</footer>


    <!-- After footer scripts -->
    
<!-- jQuery -->
<script src="//code.jquery.com/jquery-2.1.4.min.js"></script>

<!-- Bootstrap -->
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>

<!-- Gallery -->
<script src="//cdnjs.cloudflare.com/ajax/libs/featherlight/1.3.5/featherlight.min.js" type="text/javascript" charset="utf-8"></script>

<!-- Disqus Comments -->



</body>

</html>